/*!
 * \file WtRiskMonFact.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 *
 * \brief 风控监控器工厂类实现文件
 *		  本文件实现了WtRiskMonFact风控监控器工厂类的所有方法
 *		  提供风控监控器的创建、枚举、销毁等核心功能
 *		  支持C接口导出，可作为动态库插件使用
 *		  为交易系统提供灵活的风控监控器管理能力
 */
#include "WtRiskMonFact.h"
#include "WtSimpRiskMon.h"

/// 工厂名称常量
const char* FACT_NAME = "WtRiskMonFact";

/**
 * @brief C接口导出函数 - 创建风控监控器工厂
 * @return 返回风控监控器工厂接口指针
 * @details 提供C语言接口，用于动态库插件方式创建工厂实例
 *          返回的指针需要通过deleteRiskMonFact函数释放
 */
extern "C"
{
	EXPORT_FLAG IRiskMonitorFact* createRiskMonFact()
	{
		IRiskMonitorFact* fact = new WtRiskMonFact();
		return fact;
	}

	/**
	 * @brief C接口导出函数 - 销毁风控监控器工厂
	 * @param fact 要销毁的工厂指针
	 * @details 提供C语言接口，用于安全销毁工厂实例
	 *          确保内存正确释放，避免内存泄漏
	 */
	EXPORT_FLAG void deleteRiskMonFact(IRiskMonitorFact* fact)
	{
		if (fact != NULL)
			delete fact;
	}
}


/**
 * @brief 构造函数
 * @details 初始化风控监控器工厂实例
 *          执行必要的初始化操作
 */
WtRiskMonFact::WtRiskMonFact()
{
}


/**
 * @brief 析构函数
 * @details 清理风控监控器工厂资源
 *          释放相关内存和资源
 */
WtRiskMonFact::~WtRiskMonFact()
{
}

/**
 * @brief 获取工厂名称
 * @return 返回工厂名称字符串"WtRiskMonFact"
 * @details 返回当前风控监控器工厂的标识名称
 *          用于工厂识别、日志记录和调试
 */
const char* WtRiskMonFact::getName()
{
	return FACT_NAME;
}

/**
 * @brief 枚举可用的风控监控器
 * @param cb 枚举回调函数
 * @details 遍历并通过回调函数返回所有可用的风控监控器类型
 *          当前支持的监控器类型：
 *          - SimpleRiskMon: 简单风控监控器，支持回撤控制和资金管理
 *          回调函数参数：工厂名称、监控器名称、是否可用
 */
void WtRiskMonFact::enumRiskMonitors(FuncEnumRiskMonCallback cb)
{
	//cb(FACT_NAME, "WtSimpExeUnit", false);  // 已注释的旧版本
	cb(FACT_NAME, "SimpleRiskMon", true);
}

/**
 * @brief 创建风控监控器实例
 * @param name 监控器名称
 * @return 返回创建的风控监控器指针，失败返回NULL
 * @details 根据指定名称创建对应的风控监控器实例
 *          支持的监控器类型：
 *          - "SimpleRiskMon": 创建WtSimpleRiskMon简单风控监控器
 *          创建的实例需要通过deleteRiskMonotor方法销毁
 *          如果名称不匹配，返回NULL
 */
WtRiskMonitor* WtRiskMonFact::createRiskMonotor(const char* name)
{
	if (strcmp(name, "SimpleRiskMon") == 0)
		return new WtSimpleRiskMon();
	return NULL;
}

/**
 * @brief 销毁风控监控器实例
 * @param unit 要销毁的风控监控器指针
 * @return 成功返回true，失败返回false
 * @details 安全销毁指定的风控监控器实例
 *          执行以下检查和操作：
 *          1. 检查指针是否为空，空指针直接返回true
 *          2. 验证监控器是否属于当前工厂创建
 *          3. 如果验证通过，删除实例并返回true
 *          4. 如果验证失败，返回false（不删除实例）
 *          确保内存正确释放，避免内存泄漏和误删除
 */
bool WtRiskMonFact::deleteRiskMonotor(WtRiskMonitor* unit)
{
	if (unit == NULL)
		return true;

	if (strcmp(unit->getFactName(), FACT_NAME) != 0)
		return false;

	delete unit;
	return true;
}
